import { defineStore } from 'pinia'

// 应用主题类型
export type ThemeType = 'light' | 'dark' | 'auto'

// 设置状态接口
export interface SettingsState {
  // 功能开关
  memoryEnabled: boolean
  networkingEnabled: boolean
  mcpEnabled: boolean
  
  // 其他设置
  selectedTemplateId: string | null
  knowledgeId: string | null
  theme: ThemeType
  autoSave: boolean
  vectorModel: number // 改为number类型，与model.ts保持一致
  
  // API设置
  apiBaseUrl: string // API基础URL
  
  // 工作目录和Git设置
  workDirectory: string // 用户工作目录
  gitExecutablePath: string // Git可执行文件路径
  gitAutoCommit: boolean // Git自动提交
  gitAutoCommitInterval: number // Git自动提交间隔（分钟）
  gitShowHistoryInGraph: boolean // Git历史以图形方式显示
  gitDiffDisplayStyle: 'inline' | 'side-by-side' // Git差异显示样式
}

// 默认状态
const getDefaultState = (): SettingsState => ({
  memoryEnabled: false,
  networkingEnabled: false,
  mcpEnabled: false,
  selectedTemplateId: null,
  knowledgeId: null,
  theme: 'light',
  autoSave: true,
  vectorModel: 0, // 改为number类型，默认为0
  
  // API设置
  apiBaseUrl: 'http://127.0.0.1:8080', // 默认API基础URL
  
  // 工作目录和Git设置默认值
  workDirectory: 'C:\\Users\\User\\AppData\\Local\\novel', // 用户工作目录，默认为C盘用户目录/AppData/novel
  gitExecutablePath: 'C:\\Program Files\\Git\\bin\\git.exe', // Git可执行文件路径，默认为常见安装位置
  gitAutoCommit: true, // 默认启用Git自动提交
  gitAutoCommitInterval: 5, // 默认5分钟自动提交
  gitShowHistoryInGraph: true, // 默认以图形方式显示Git历史
  gitDiffDisplayStyle: 'side-by-side' // 默认并排显示差异
})

// 主题应用函数
function applyTheme(theme: ThemeType) {
  // 确保在客户端环境下执行
  if (typeof window === 'undefined') return
  
  if (theme === 'auto') {
    // 自动模式：根据系统偏好设置
    const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches
    applyThemeInternal(prefersDark ? 'dark' : 'light')
    
    // 监听系统主题变化
    const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')
    const handleSystemThemeChange = (e: MediaQueryListEvent) => {
      applyThemeInternal(e.matches ? 'dark' : 'light')
    }
    
    // 移除之前的监听器（如果有）
    if ((window as any).themeChangeListener) {
      mediaQuery.removeEventListener('change', (window as any).themeChangeListener)
    }
    
    // 添加新的监听器
    mediaQuery.addEventListener('change', handleSystemThemeChange)
    ;(window as any).themeChangeListener = handleSystemThemeChange
  } else {
    // 非自动模式，直接应用主题
    applyThemeInternal(theme)
    
    // 移除监听器
    const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')
    if ((window as any).themeChangeListener) {
      mediaQuery.removeEventListener('change', (window as any).themeChangeListener)
      ;(window as any).themeChangeListener = null
    }
  }
}

// 内部主题应用函数
function applyThemeInternal(theme: 'light' | 'dark') {
  // 确保在客户端环境下执行
  if (typeof window === 'undefined') return
  
  const root = document.documentElement
  
  if (theme === 'dark') {
    // 深色主题
    root.style.setProperty('--bg-primary', '#1a1a1a')
    root.style.setProperty('--bg-secondary', '#2d2d2d')
    root.style.setProperty('--bg-card', '#2d2d2d')
    root.style.setProperty('--text-primary', '#ffffff')
    root.style.setProperty('--text-secondary', '#b0b0b0')
    root.style.setProperty('--border-color', '#404040')
    root.style.setProperty('--shadow-color', 'rgba(0, 0, 0, 0.3)')
    root.style.setProperty('--accent-color', '#1890ff')
    root.style.setProperty('--success-color', '#52c41a')
    root.style.setProperty('--warning-color', '#faad14')
    root.style.setProperty('--error-color', '#ff4d4f')
  } else {
    // 浅色主题
    root.style.setProperty('--bg-primary', '#ffffff')
    root.style.setProperty('--bg-secondary', '#f5f5f5')
    root.style.setProperty('--bg-card', '#ffffff')
    root.style.setProperty('--text-primary', '#1a1a1a')
    root.style.setProperty('--text-secondary', '#666666')
    root.style.setProperty('--border-color', '#e0e0e0')
    root.style.setProperty('--shadow-color', 'rgba(0, 0, 0, 0.1)')
    root.style.setProperty('--accent-color', '#1890ff')
    root.style.setProperty('--success-color', '#52c41a')
    root.style.setProperty('--warning-color', '#faad14')
    root.style.setProperty('--error-color', '#ff4d4f')
  }
}

export const useSettingsStore = defineStore('settings', {
  state: (): SettingsState => getDefaultState(),
  
  getters: {
    // 获取当前主题
    currentTheme: (state) => state.theme,
    
    // 获取功能开关状态
    featureFlags: (state) => ({
      memory: state.memoryEnabled,
      networking: state.networkingEnabled,
      mcp: state.mcpEnabled
    })
  },
  
  actions: {
    // 设置记忆功能开关
    setMemoryEnabled(enabled: boolean) {
      this.memoryEnabled = enabled
    },
    
    // 设置网络功能开关
    setNetworkingEnabled(enabled: boolean) {
      this.networkingEnabled = enabled
    },
    
    // 设置MCP功能开关
    setMcpEnabled(enabled: boolean) {
      this.mcpEnabled = enabled
    },
    
    // 设置选中的模板ID
    setSelectedTemplateId(id: string | null) {
      this.selectedTemplateId = id
    },
    
    // 设置知识库ID
    setKnowledgeId(id: string | null) {
      this.knowledgeId = id
    },
    
    // 设置主题
    setTheme(theme: ThemeType) {
      this.theme = theme
      applyTheme(theme)
      
      // 如果是自动模式，需要触发组件更新以响应系统主题变化
      if (theme === 'auto' && typeof window !== 'undefined') {
        // 触发窗口大小变化事件，强制Vue重新计算计算属性
        window.dispatchEvent(new Event('resize'))
      }
    },
    
    // 设置自动保存
    setAutoSave(autoSave: boolean) {
      this.autoSave = autoSave
    },
    
    // 设置向量模型
    setVectorModel(vectorModel: string | number) {
      this.vectorModel = Number(vectorModel)
    },
    
    // 设置API基础URL
    setApiBaseUrl(url: string) {
      this.apiBaseUrl = url
      // 同时保存到localStorage，供ApiConfig在Pinia初始化之前使用
      localStorage.setItem('apiBaseUrl', url)
    },
    
    // 设置工作目录
    setWorkDirectory(directory: string) {
      this.workDirectory = directory
    },
    
    // 设置Git可执行文件路径
    setGitExecutablePath(path: string) {
      this.gitExecutablePath = path
    },
    
    // 设置Git自动提交
    setGitAutoCommit(enabled: boolean) {
      this.gitAutoCommit = enabled
    },
    
    // 设置Git自动提交间隔
    setGitAutoCommitInterval(interval: number) {
      this.gitAutoCommitInterval = interval
    },
    
    // 设置Git历史显示方式
    setGitShowHistoryInGraph(show: boolean) {
      this.gitShowHistoryInGraph = show
    },
    
    // 设置Git差异显示样式
    setGitDiffDisplayStyle(style: 'inline' | 'side-by-side') {
      this.gitDiffDisplayStyle = style
    },
    
    // 批量更新设置
    updateSettings(settings: Partial<SettingsState>) {
      Object.assign(this, settings)
      
      // 如果更新了主题，应用主题
      if (settings.theme) {
        applyTheme(settings.theme)
      }
    },
    
    // 初始化主题
    initTheme() {
      // 确保在客户端环境下执行
      if (typeof window !== 'undefined') {
        applyTheme(this.theme)
      }
    },
    
    // 重置设置状态
    resetSettingsState() {
      // 保留主题设置
      const { theme } = this
      
      // 重置为默认状态
      Object.assign(this, getDefaultState())
      
      // 恢复主题设置
      this.theme = theme
      
      // 重新初始化主题
      applyTheme(this.theme)
    }
  },
  
  // 配置持久化
  persist: {
    key: 'settings-store',
    storage: localStorage,
    pick: [
      'memoryEnabled',
      'networkingEnabled',
      'mcpEnabled',
      'selectedTemplateId',
      'knowledgeId',
      'theme',
      'autoSave',
      'vectorModel',
      'apiBaseUrl',
      'workDirectory',
      'gitExecutablePath',
      'gitAutoCommit',
      'gitAutoCommitInterval',
      'gitShowHistoryInGraph',
      'gitDiffDisplayStyle'
    ]
  }
})

// 导出设置存储类型
export type SettingsStore = ReturnType<typeof useSettingsStore>